#include <iostream>
#include <unordered_map>
#include <gtest/gtest.h>

// class HashTestEnv : public testing::Test
// {
// public:
//     static void SetUpTestCase()
//     {
//         std::cout << "环境1第⼀个TEST之前调⽤\n";
//     }
//     static void TearDownTestCase()
//     {
//         std::cout << "环境1第⼀个TEST之前调⽤\n";
//     }

// public:
//     std::unordered_map<std::string, std::string> _map;
// };

// // 注意,测试套件使⽤的不是TEST了,⽽是TEST_F, ⽽第⼀个参数名称就是测试套件环境类名称
// // main函数中不需要再注册环境了,⽽是在TEST_F中可以直接访问类的成员变量和成员函数
// TEST_F(HashTestEnv, map_insert)
// {
//     std::cout << "环境1,中间insert测试\n";
//     _map.insert(std::make_pair("Hello", "你好"));
// }

// // 每个测试单元在进行测试时都会进行初始化
// TEST_F(HashTestEnv, map_size)
// {
//     std::cout << "环境1,中间size测试\n";
//     ASSERT_EQ(_map.size(), 1); // 为0
// }

// int main(int argc, char *argv[])
// {
//     testing::InitGoogleTest(&argc, argv);
//     return RUN_ALL_TESTS();
// }

class HashTestEnv : public testing::Test
{
public:
    static void SetUpTestCase()
    {
        std::cout << "所有单元测试前执行，初始化总环境!\n";
        // 如果有全局的容器, 这里可以进行公共测试数据的插入
    }
    static void TearDownTestCase()
    {
        //清理公共的测试数据
        std::cout << "所有单元测试完毕执行，清理总环境!\n";
    }
    void SetUp() override
    {
        // 在这里插入每个单元测试所需的独立的测试数据
        std::cout << "单元测试初始化！！\n";
        _map.insert(std::make_pair("hello", "你好"));
        _map.insert(std::make_pair("bye", "再见"));
    }
    void TearDown() override
    {
        // 在这里清理每个单元测试自己插入的数据
        _map.clear();
        std::cout << "单元测试清理！！\n";
    }

public:
    std::unordered_map<std::string, std::string> _map;
};

// 注意,测试套件使⽤的不是TEST了,⽽是TEST_F, ⽽第⼀个参数名称就是测试套件环境类名称
// main函数中不需要再注册环境了,⽽是在TEST_F中可以直接访问类的成员变量和成员函数
TEST_F(HashTestEnv, map_insert)
{
    std::cout << "环境2,中间insert测试\n";
    _map.insert(std::make_pair("Hello", "你好"));
    ASSERT_EQ(_map.size(), 3);
}

// 每个测试单元在进行测试时都会进行初始化
TEST_F(HashTestEnv, map_size)
{
    std::cout << "环境2,中间size测试\n";
    ASSERT_EQ(_map.size(), 2); 
}

int main(int argc, char *argv[])
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}